﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Web;

namespace FileUpload
{
    public class PTImage
    {
        public static string GetFileExtendName(string filename)
        {
            string[] Extend = filename.Split(new char[] { '.' });
            string ExtendName = Extend[Extend.Length - 1];
            return ExtendName.ToUpper();
        }

        public static string GetFileName(string filename)
        {
            string[] Extend = filename.Split(new char[] { '.' });
            string ExtendName = Extend[0];
            return ExtendName;
        }
        /// <summary>
        /// 生成缩略图
        /// </summary>
        /// <param name="originalImagePath">源图路径（物理路径）</param>
        /// <param name="thumbnailPath">缩略图路径（物理路径）</param>
        /// <param name="width">缩略图宽度</param>
        /// <param name="height">缩略图高度</param>
        /// <param name="mode">生成缩略图的方式</param>    
        /// 
        public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
        {
            if (File.Exists(thumbnailPath))
            {
                File.Delete(thumbnailPath);
            }
            Image originalImage = Image.FromFile(originalImagePath);

            int towidth = width;
            int toheight = height;

            int x = 0;
            int y = 0;
            int ow = originalImage.Width;
            int oh = originalImage.Height;

            switch (mode)
            {
                case "HW"://指定高宽缩放（可能变形）                
                    break;
                case "W"://指定宽，高按比例                    
                    toheight = originalImage.Height * width / originalImage.Width;
                    break;
                case "H"://指定高，宽按比例
                    towidth = originalImage.Width * height / originalImage.Height;
                    break;
                case "Cut"://指定高宽裁减（不变形）                
                    if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
                    {
                        oh = originalImage.Height;
                        ow = originalImage.Height * towidth / toheight;
                        y = 0;
                        x = (originalImage.Width - ow) / 2;
                    }
                    else
                    {
                        ow = originalImage.Width;
                        oh = originalImage.Width * height / towidth;
                        x = 0;
                        y = (originalImage.Height - oh) / 2;
                    }
                    break;
                default:
                    break;
            }

            //新建一个bmp图片
            Image bitmap = new System.Drawing.Bitmap(towidth, toheight);

            //新建一个画板
            Graphics g = System.Drawing.Graphics.FromImage(bitmap);

            //设置高质量插值法
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

            //设置高质量,低速度呈现平滑程度
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            //清空画布并以透明背景色填充
            g.Clear(Color.Transparent);

            //在指定位置并且按指定大小绘制原图片的指定部分
            g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
                new Rectangle(x, y, ow, oh),
                GraphicsUnit.Pixel);
            try
            {
                //以jpg格式保存缩略图
                bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            catch (System.Exception e)
            {
                throw e;
            }
            finally
            {
                originalImage.Dispose();
                bitmap.Dispose();
                g.Dispose();
            }
        }

        /// <summary>
        /// 生成正方形缩略图
        /// </summary>
        /// <param name="postedFile">源图路径（物理路径）</param>
        /// <param name="fileSaveUrl">缩略图路径（物理路径）</param>
        /// <param name="side">缩略图高宽度</param>
        /// <param name="quality">精细度</param>
        public static void WhiteCutForSquare(string postedFile, string fileSaveUrl, int side, int quality)
        {
            //创建目录  
            string dir = Path.GetDirectoryName(fileSaveUrl);
            if (!Directory.Exists(dir))
                Directory.CreateDirectory(dir);

            System.Drawing.Image initImage = Image.FromFile(postedFile);


            //缩略图宽、高计算  
            double newWidth = initImage.Width;
            double newHeight = initImage.Height;
            int newPointWidth = 0;
            int newPointHeight = 0;
            if (!(initImage.Width <= side && initImage.Height <= side))
            {

                //宽大于高或宽等于高（横图或正方）  
                if (initImage.Width > initImage.Height || initImage.Width == initImage.Height)
                {
                    //如果宽大于模版  
                    if (initImage.Width > side)
                    {
                        //宽按模版，高按比例缩放  
                        newWidth = side;
                        newHeight = (double)initImage.Height * ((double)side / (double)initImage.Width);

                    }
                    newPointWidth = 0;
                    newPointHeight = (int)(((double)side - newHeight) / 2);
                }

                //高大于宽（竖图）  
                else
                {
                    //如果高大于模版  
                    if (initImage.Height > side)
                    {
                        //高按模版，宽按比例缩放  
                        newHeight = side;
                        newWidth = (double)initImage.Width * ((double)side / (double)initImage.Height);
                    }
                    newPointWidth = (int)(((double)side - newWidth) / 2);
                    newPointHeight = 0;
                }

            }

            //生成新图  
            //新建一个bmp图片  
            System.Drawing.Image newImage = new System.Drawing.Bitmap((int)side, (int)side, PixelFormat.Format24bppRgb);
            //新建一个画板  
            System.Drawing.Graphics newG = System.Drawing.Graphics.FromImage(newImage);
            //设置质量  
            newG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            // newG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
            newG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;


            //置背景色  
            newG.Clear(Color.White);
            //画图  
            newG.DrawImage(initImage, new System.Drawing.Rectangle(newPointWidth, newPointHeight, (int)newWidth, (int)newHeight), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);

            //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff  
            ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
            ImageCodecInfo ici = null;
            foreach (ImageCodecInfo i in icis)
            {
                if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
                {
                    ici = i;
                }
            }

            EncoderParameters ep = new EncoderParameters(1);
            ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
            //保存缩略图  
            try
            {
                //以jpg格式保存缩略图
                newImage.Save(fileSaveUrl, ici, ep);
                //  newImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            catch (System.Exception e)
            {
                throw e;
            }
            finally
            {
                //释放关键质量控制所用资源  
                ep.Dispose();
                //释放缩略图资源  
                newG.Dispose();
                newImage.Dispose();
                //释放原始图片资源  
                initImage.Dispose();
            }

        }

        public static void CutForSquare(string postedFile, string fileSaveUrl, int side, int quality)
        {
            //创建目录  
            string dir = Path.GetDirectoryName(fileSaveUrl);
            if (!Directory.Exists(dir))
                Directory.CreateDirectory(dir);
            //原始图片（获取原始图片创建对象，并使用流中嵌入的颜色管理信息）  
            System.Drawing.Image initImage = Image.FromFile(postedFile);
            //原图宽高均小于模版，不作处理，直接保存  
            if (initImage.Width <= side && initImage.Height <= side)
            {
                initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            else
            {
                //原始图片的宽、高  
                int initWidth = initImage.Width;
                int initHeight = initImage.Height;
                //非正方型先裁剪为正方型  
                if (initWidth != initHeight)
                {
                    //截图对象  
                    System.Drawing.Image pickedImage = null;
                    System.Drawing.Graphics pickedG = null;
                    //宽大于高的横图  
                    if (initWidth > initHeight)
                    {
                        //对象实例化  
                        pickedImage = new System.Drawing.Bitmap(initHeight, initHeight);
                        pickedG = System.Drawing.Graphics.FromImage(pickedImage);
                        //设置质量  
                        pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                        pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                        //定位  
                        Rectangle fromR = new Rectangle((initWidth - initHeight) / 2, 0, initHeight, initHeight);
                        Rectangle toR = new Rectangle(0, 0, initHeight, initHeight);
                        //画图  
                        pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
                        //重置宽  
                        initWidth = initHeight;
                    }
                    //高大于宽的竖图  
                    else
                    {
                        //对象实例化  
                        pickedImage = new System.Drawing.Bitmap(initWidth, initWidth);
                        pickedG = System.Drawing.Graphics.FromImage(pickedImage);
                        //设置质量  
                        pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                        pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                        //定位  
                        Rectangle fromR = new Rectangle(0, (initHeight - initWidth) / 2, initWidth, initWidth);
                        Rectangle toR = new Rectangle(0, 0, initWidth, initWidth);
                        //画图  
                        pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
                        //重置高  
                        initHeight = initWidth;
                    }

                    //将截图对象赋给原图  
                    initImage = (System.Drawing.Image)pickedImage.Clone();
                    //释放截图资源  
                    pickedG.Dispose();
                    pickedImage.Dispose();
                }

                //缩略图对象  
                System.Drawing.Image resultImage = new System.Drawing.Bitmap(side, side);
                System.Drawing.Graphics resultG = System.Drawing.Graphics.FromImage(resultImage);
                //设置质量  
                resultG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                resultG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                //用指定背景色清空画布  
                resultG.Clear(Color.White);
                //绘制缩略图  
                resultG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, side, side), new System.Drawing.Rectangle(0, 0, initWidth, initHeight), System.Drawing.GraphicsUnit.Pixel);

                //关键质量控制  
                //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff  
                ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
                ImageCodecInfo ici = null;
                foreach (ImageCodecInfo i in icis)
                {
                    if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
                    {
                        ici = i;
                    }
                }
                EncoderParameters ep = new EncoderParameters(1);
                ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
                //保存缩略图  
                resultImage.Save(fileSaveUrl, ici, ep);
                //释放关键质量控制所用资源  
                ep.Dispose();
                //释放缩略图资源  
                resultG.Dispose();
                resultImage.Dispose();
                //释放原始图片资源  
                initImage.Dispose();
            }
        }

        public static void CutForCustom(string postedFile, string fileSaveUrl, int maxWidth, int maxHeight, int quality)
        {
            //从文件获取原始图片，并使用流中嵌入的颜色管理信息  
            System.Drawing.Image initImage = Image.FromFile(postedFile);
            //原图宽高均小于模版，不作处理，直接保存  
            if (initImage.Width <= maxWidth && initImage.Height <= maxHeight)
            {
                initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            else
            {
                //模版的宽高比例  
                double templateRate = (double)maxWidth / maxHeight;

                //原图片的宽高比例  
                double initRate = (double)initImage.Width / initImage.Height;

                //原图与模版比例相等，直接缩放  
                if (templateRate == initRate)
                {
                    //按模版大小生成最终图片  
                    System.Drawing.Image templateImage = new System.Drawing.Bitmap(maxWidth, maxHeight);
                    System.Drawing.Graphics templateG = System.Drawing.Graphics.FromImage(templateImage);
                    templateG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                    templateG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                    templateG.Clear(Color.White);
                    templateG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, maxWidth, maxHeight), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);
                    templateImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
                }
                //原图与模版比例不等，裁剪后缩放  
                else
                {
                    //裁剪对象  
                    System.Drawing.Image pickedImage = null;
                    System.Drawing.Graphics pickedG = null;
                    //定位  
                    Rectangle fromR = new Rectangle(0, 0, 0, 0);//原图裁剪定位  
                    Rectangle toR = new Rectangle(0, 0, 0, 0);//目标定位  
                    //宽为标准进行裁剪  
                    if (templateRate > initRate)
                    {
                        //裁剪对象实例化  
                        pickedImage = new System.Drawing.Bitmap(initImage.Width, (int)Math.Floor(initImage.Width / templateRate));
                        pickedG = System.Drawing.Graphics.FromImage(pickedImage);
                        //裁剪源定位  
                        fromR.X = 0;
                        fromR.Y = (int)Math.Floor((initImage.Height - initImage.Width / templateRate) / 2);
                        fromR.Width = initImage.Width;
                        fromR.Height = (int)Math.Floor(initImage.Width / templateRate);
                        //裁剪目标定位  
                        toR.X = 0;
                        toR.Y = 0;
                        toR.Width = initImage.Width;
                        toR.Height = (int)Math.Floor(initImage.Width / templateRate);
                    }
                    //高为标准进行裁剪  
                    else
                    {
                        pickedImage = new System.Drawing.Bitmap((int)Math.Floor(initImage.Height * templateRate), initImage.Height);
                        pickedG = System.Drawing.Graphics.FromImage(pickedImage);
                        fromR.X = (int)Math.Floor((initImage.Width - initImage.Height * templateRate) / 2);
                        fromR.Y = 0;
                        fromR.Width = (int)Math.Floor(initImage.Height * templateRate);
                        fromR.Height = initImage.Height;
                        toR.X = 0;
                        toR.Y = 0;
                        toR.Width = (int)Math.Floor(initImage.Height * templateRate);
                        toR.Height = initImage.Height;
                    }
                    //设置质量  
                    pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                    pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                    //裁剪  
                    pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
                    //按模版大小生成最终图片  
                    System.Drawing.Image templateImage = new System.Drawing.Bitmap(maxWidth, maxHeight);
                    System.Drawing.Graphics templateG = System.Drawing.Graphics.FromImage(templateImage);
                    templateG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                    templateG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                    templateG.Clear(Color.White);
                    templateG.DrawImage(pickedImage, new System.Drawing.Rectangle(0, 0, maxWidth, maxHeight), new System.Drawing.Rectangle(0, 0, pickedImage.Width, pickedImage.Height), System.Drawing.GraphicsUnit.Pixel);
                    //关键质量控制  
                    //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff  
                    ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
                    ImageCodecInfo ici = null;
                    foreach (ImageCodecInfo i in icis)
                    {
                        if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
                        {
                            ici = i;
                        }
                    }
                    EncoderParameters ep = new EncoderParameters(1);
                    ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
                    //保存缩略图  
                    templateImage.Save(fileSaveUrl, ici, ep);
                    //templateImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);  
                    //释放资源  
                    templateG.Dispose();
                    templateImage.Dispose();
                    pickedG.Dispose();
                    pickedImage.Dispose();
                }
            }
        }
    }
}